package com.xp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xp.dto.flow.FlowDefinitionDTO;
import com.xp.dto.flow.FlowDefinitionRequest;
import com.xp.dto.flow.FlowQueryRequest;
import com.xp.dto.flow.StatusUpdateRequest;
import com.xp.entity.FlowDefinition;
import com.xp.utils.Result;

import java.util.List;

/**
 * 流程定义服务接口
 * 
 * @author xp
 * @since 2025-01-01
 */
public interface FlowDefinitionService extends BaseService<FlowDefinition> {

    /**
     * 分页查询流程定义列表
     * 
     * @param page 分页参数
     * @param queryRequest 查询条件
     * @return 流程定义分页结果
     */
    Result<IPage<FlowDefinitionDTO>> getFlowDefinitionPage(Page<FlowDefinition> page, FlowQueryRequest queryRequest);

    /**
     * 创建流程定义
     * 
     * @param request 流程定义请求
     * @return 操作结果
     */
    Result<Long> createFlowDefinition(FlowDefinitionRequest request);

    /**
     * 更新流程定义
     * 
     * @param id 流程定义ID
     * @param request 流程定义请求
     * @return 操作结果
     */
    Result<Object> updateFlowDefinition(Long id, FlowDefinitionRequest request);

    /**
     * 删除流程定义
     * 
     * @param id 流程定义ID
     * @return 操作结果
     */
    Result<Object> deleteFlowDefinition(Long id);

    /**
     * 根据ID获取流程定义详情
     * 
     * @param id 流程定义ID
     * @return 流程定义信息
     */
    Result<FlowDefinitionDTO> getFlowDefinitionById(Long id);

    /**
     * 根据流程编码获取流程定义
     * 
     * @param flowCode 流程编码
     * @return 流程定义信息
     */
    Result<FlowDefinitionDTO> getFlowDefinitionByCode(String flowCode);

    /**
     * 根据流程编码和版本获取流程定义
     * 
     * @param flowCode 流程编码
     * @param version 版本号
     * @return 流程定义信息
     */
    Result<FlowDefinitionDTO> getFlowDefinitionByCodeAndVersion(String flowCode, String version);

    /**
     * 获取所有启用的流程定义
     * 
     * @return 流程定义列表
     */
    Result<List<FlowDefinitionDTO>> getEnabledFlowDefinitions();

    /**
     * 根据应用名称获取流程定义列表
     * 
     * @param applicationName 应用名称
     * @return 流程定义列表
     */
    Result<List<FlowDefinitionDTO>> getFlowDefinitionsByApplication(String applicationName);

    /**
     * 根据分类获取流程定义列表
     *
     * @param category 流程分类
     * @return 流程定义列表
     */
    Result<List<FlowDefinitionDTO>> getFlowDefinitionsByCategory(String category);

    /**
     * 更新流程定义状态
     * 
     * @param id 流程定义ID
     * @param statusRequest 状态更新请求
     * @return 操作结果
     */
    Result<Object> updateFlowDefinitionStatus(Long id, StatusUpdateRequest statusRequest);

    /**
     * 发布流程定义
     * 
     * @param id 流程定义ID
     * @return 操作结果
     */
    Result<Object> publishFlowDefinition(Long id);

    /**
     * 下线流程定义
     * 
     * @param id 流程定义ID
     * @return 操作结果
     */
    Result<Object> unpublishFlowDefinition(Long id);

    /**
     * 复制流程定义
     * 
     * @param id 源流程定义ID
     * @param newFlowCode 新流程编码
     * @param newFlowName 新流程名称
     * @return 操作结果
     */
    Result<Long> copyFlowDefinition(Long id, String newFlowCode, String newFlowName);

    /**
     * 验证流程定义配置
     * 
     * @param flowDefinition 流程定义配置
     * @param nodeDefinitions 节点定义配置
     * @return 验证结果
     */
    Result<Object> validateFlowConfig(String flowDefinition, String nodeDefinitions);

    /**
     * 获取流程定义的版本列表
     * 
     * @param flowCode 流程编码
     * @return 版本列表
     */
    Result<List<String>> getFlowVersions(String flowCode);

    /**
     * 创建流程定义新版本
     * 
     * @param id 源流程定义ID
     * @param version 新版本号
     * @return 操作结果
     */
    Result<Long> createFlowVersion(Long id, String version);

    /**
     * 获取流程定义统计信息
     * 
     * @return 统计信息
     */
    Result<Object> getFlowDefinitionStatistics();

    /**
     * 导出流程定义
     * 
     * @param id 流程定义ID
     * @return 导出数据
     */
    Result<Object> exportFlowDefinition(Long id);

    /**
     * 导入流程定义
     * 
     * @param flowData 流程数据
     * @return 操作结果
     */
    Result<Long> importFlowDefinition(String flowData);

    /**
     * 保存流程设计数据
     * 
     * @param id 流程定义ID
     * @param flowData 流程图数据
     * @return 操作结果
     */
    Result<Object> saveFlowDesign(Long id, Object flowData);

    /**
     * 转换LogicFlow数据为LiteFlow规则
     * 
     * @param id 流程定义ID
     * @return 转换结果
     */
    Result<Object> convertToLiteFlow(Long id);

    /**
     * 预览LiteFlow EL表达式
     * 
     * @param flowData LogicFlow流程图数据
     * @return EL表达式预览结果
     */
    Result<Object> previewLiteFlowExpression(Object flowData);
}